#pragma once

// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

#include <string>
#include <list>
#include "Object.h"
#include "SQLObjectImpl.h"
#include "SQLDataType.h"
#include "SQLExpr.h"
#include "../../DbType.h"
class SQLASTVisitor;

class SQLDataTypeImpl
    : virtual public SQLObjectImpl,
      virtual public SQLDataType
{

protected:
  string_ptr name;
  SQLExpr_list_ptr arguments;
  long nameHashCode64_;

  void accept0(SQLASTVisitor_ptr visitor);
  int listHashcode();
  int stringHashcode(string_ptr x);
  DbType dbType;
  BOOL_ptr unsigned_;
  BOOL_ptr zerofill;
  SQLExpr_ptr indexBy;

public:
  SQLDataTypeImpl();
  ~SQLDataTypeImpl();
  SQLDataTypeImpl(string_ptr theName);
  SQLDataTypeImpl(string_ptr theName, int precision);
  SHAREDOBJECT(SQLDataTypeImpl);
  string_ptr getName();

  void setName(string_ptr theName);

  SQLExpr_list_ptr getArguments();

  int hashCode();

  bool equals(Object_ptr obj);

  virtual string_ptr getClass()
  {
    return make_string_ptr("SQLDataTypeImpl");
  }

  virtual BOOL_ptr hasKeyLength();

  long nameHashCode64();

  // virtual SQLDataTypeImpl* clone();
  virtual SQLObject_ptr clone();
  virtual int jdbcType();
  void cloneTo(SQLDataTypeImpl_ptr x);
  void addArgument(SQLExpr_ptr argument);

  virtual bool containsAttribute(string_ptr theName){};
  virtual void output(string_ptr buf){};
  virtual void addBeforeComment(string_list_ptr comments){};
  virtual string_list_ptr getBeforeCommentsDirect(){};
  virtual void addAfterComment(string_ptr comment){};
  virtual void addAfterComment(string_list_ptr comments){};
  virtual string_list_ptr getAfterCommentsDirect(){};
  virtual bool hasBeforeComment(){};
  virtual bool hasAfterComment(){};
  virtual BOOL_ptr getWithTimeZone(){};
  virtual void setWithTimeZone(BOOL_ptr value){};
  virtual BOOL_ptr isWithLocalTimeZone(){};
  virtual void setWithLocalTimeZone(BOOL_ptr value){};
  virtual void setDbType(DbType_ptr dbType){};
  virtual DbType_ptr getDbType(){};
  virtual BOOL_ptr isInt(){};
  virtual BOOL_ptr isNumberic(){};
  virtual BOOL_ptr isString(){};
  void setUnsigned(BOOL_ptr unsigned_);
  void setZerofill(BOOL_ptr zerofill);
  void setIndexBy(SQLExpr_ptr x);
  SQLExpr_ptr getIndexBy();
};
// typedef boost::shared_ptr<SQLDataTypeImpl> SQLDataTypeImpl_ptr;
